package com.wang.tool.monitor.translator;

import com.wang.tool.common.ErrorInfo;
import com.wang.tool.common.SimpleException;
import com.wang.tool.util.SimpleLogUtil;

/**
 * 全局异常翻译器
 * 为什么单独设计一个类管理异常翻译器?
 * 想想为啥spring在web设计了一个全局异常处理机制?
 * 无论何时何地都可以方便使用到某个工具
 *
 * @Author wangshaopeng
 * @Date 2022/6/28
 */
public class GlobalErrorTranslator {


    /**
     * 全局配置
     */
    private static ErrorTranslator translator = new SimpleErrorTranslator();

    /**
     * 转换异常
     * 不会报错
     *
     * @param error 异常
     * @return 非空
     */
    public static ErrorInfo translate(Throwable error) {
        error = error != null ? error : new SimpleException("errorIsNull", "errorIsNull");
        if (translator == null) {
            if (error instanceof SimpleException) {
                return ErrorInfo.build(error, ((SimpleException) error).getCode(), error.getMessage());
            } else {
                return ErrorInfo.build(error, SimpleException.UNKNOWN_ERROR, error.getMessage());
            }
        }
        try {
            ErrorInfo errorInfo = translator.translate(error);
            return errorInfo == null ? ErrorInfo.build(error, SimpleException.UNKNOWN_ERROR, error.getMessage()) : errorInfo;
        } catch (Throwable e) {
            SimpleLogUtil.error("globalErrorTranslatorError", e);
            return ErrorInfo.build(error, SimpleException.UNKNOWN_ERROR, error.getMessage());
        }
    }

    /**
     * 设置全局异常翻译器
     *
     * @param translator 非空
     */
    public static void setTranslator(ErrorTranslator translator) {
        GlobalErrorTranslator.translator = translator;
        SimpleLogUtil.info("[changeGlobalErrorTranslator] translator:{0}", translator);
    }


}
